//	COPYRIGHT (C) 1980 BY BOARD OF TRUSTEES,
//	LELAND STANFORD JUNIOR UNIVERSITY

//APRIL 25, 1978
//BCPL-CONGEN, WRITTEN BY RAY CARHART.  THIS FILE CONTAINS THE
//PRIMARY ENTRY POINT FOR THE GRAPH MATCHER.
LET GMATCH(PATREC,MXMCH,GSTRT,GSTP,NOTLIKEFN,PROCMATCHFN) = VALOF
 $( STATIC $( MCHSIZ = NIL; NCE = NIL; CEN1 = NIL; CEN2 = NIL;
              NCN = NIL; CN = NIL; MAXMATCH = NIL; STOPLOOPS = NIL;
              NMATCH = NIL; MATCHES = NIL; PSTART = NIL; PSTOP = NIL;
              GSTART = NIL; GSTOP = NIL; LNODES = NIL; FROMNDS = NIL;
              FROMBOS = NIL; TONDS = NIL; TOBOS = NIL; NLNODES = NIL;
              PTNUM = NIL; PTMAX = NIL; PTNODE = NIL; G = NIL $);
 STATIC $( NOTLIKE = NIL; PROCMATCH = NIL $);
 GET "LNKMCH.BCL[1,35]"
 GET "SMATCH.BCL[1,35]"

 NOTLIKE:=(NOTLIKEFN=0 -> NOTLIKE0,NOTLIKEFN);
 PROCMATCH:=(PROCMATCHFN=0 -> PROCMATCH0,PROCMATCHFN);
 PSTART:=PATREC!1;
 PSTOP:=PATREC!2;
 NCE:=PATREC!3;
 CEN1:=PATREC!4;
 CEN2:=PATREC!5;
 NCN:=PATREC!6;
 CN:=PATREC!7;
 LNODES:=PATREC!8;
 NLNODES:=LNODES!0;
 FROMNDS:=PATREC!9;
 FROMBOS:=PATREC!10;
 TONDS:=PATREC!11;
 TOBOS:=PATREC!12;
 MCHSIZ:=NCN+[NCE<<1];
 MAXMATCH:=MXMCH;
 GSTART:=GSTRT;
 GSTOP:=GSTP;
 IF PATREC!13 DO
  $(
  PTNUM:=0;
  PTMAX:=MAXMATCH;
  MAXMATCH:=1;
  PTNODE:=CN!1;
  G:=GSTART-1;
  WHILE G<GSTOP DO
   $(
   G+:=1;
   IF MAPPEDTO!G NE 0 DO LOOP;
   IF NOTLIKE(PTNODE,G) DO LOOP;
   NMATCH:=0;
   STOPLOOPS:=FALSE;
   ASSIGN(PTNODE,G);
   SMATCH1();
   DEASSIGN(PTNODE,0);
   IF NMATCH=0 DO LOOP;
   PTNUM+:=NUMHS!G;
   IF PTNUM>PTMAX DO RESULTIS PTMAX
   $);
  RESULTIS PTNUM
  $);
 IF PROCMATCHFN=0 DO
  $(
  STOPLOOPS:=FALSE;
  NMATCH:=0;
  IF MAXMATCH>1 DO MATCHES:=NEWVEC(MAXMATCH);
  SMATCH0();
  IF MAXMATCH=1 DO RESULTIS NMATCH;
  MAXMATCH:=NMATCH;
  WHILE NMATCH>0 DO $( FREEVEC(MATCHES!NMATCH); NMATCH-:=1 $);
  FREEVEC(MATCHES);
  RESULTIS MAXMATCH
  $);
 STOPLOOPS:=FALSE;
 SMATCH0();
 RESULTIS 0
 $);

//LET GMATCH(PATREC,MXMCH,GSTRT,GSTP,X,Y) = VALOF $( STATIC $( ANS = NIL;
//V = NIL $); V:=NEWVEC(1); OUTNOS(V); FREEVEC(V);
//ANS:=GMATCH0(PATREC,MXMCH,GSTRT,GSTP,X,Y);
//V:=NEWVEC(1); OUTNOL(V); FREEVEC(V); RESULTIS ANS $);

LET PATTEST(GSTART,GSTOP) = VALOF
 $( STATIC $( PAT = NIL $);
 PAT:=0;
 WHILE PAT<NUMPAT DO
  $(
  PAT+:=1;
  UNLESS
   PATMINS!PAT LE
   GMATCH( PATRECS!PAT,
           (PATMAXS!PAT=100 -> PATMINS!PAT,PATMAXS!PAT+1),
           GSTART,GSTOP,0,0)
   LE PATMAXS!PAT DO RESULTIS FALSE
  $);
 RESULTIS TRUE
 $);

